Programacion AVR hardware interrupts

Contenido

Configurar y utilizar las interrupciones de hardware para detectar entradas y realizar acciones en consecuencia.

En el Atmega168pa tenemos dos puertos especificos para los hardware interrupts:

Y a mayores todos los registros de puertos (B, C y D) tienen sus propios interrupts, PinChange Interrupt, pero en este caso es un interrupt por cada registro, por lo que una vez disparado el interrupt tendremos que comprobar el puerto exacto que ha generado esa interrupción

Descripcion

Para utilizar los interrupts con los puertos especificos (INT0 e INT1) tenemos que realizar los siguientes pasos:

PinChange Interrupt

Para activar las interrupciones en los registros de los puertos estandar (B, C y D) lo hacemos de la siguiente manera:

NOTA: en estos puertos no se puede indicar cual es el evento que genera la interrupción (ya sea al pulsar, soltar...etc) como con INT0 e INT1, en estos puertos siempre se genera una interrupción al haber un cambio en la entrada, ya sea soltar y pulsar.

Evitar rebote de interrupciones

Cuando se genera una interrupción y se ejecuta la funcion ISR(), en ese momento si se produce una nueva interrupción no se interrumpe la propia llamada a ISR(), si no que una vez acaba la ejecución de la ISR() actual se lanza esta nueva excepción que se ha producido durante la ejecución de la excepción.

Solo se almacena una interrupción que se haya producido, si se producen 5 interrupciones NO se ejecutará ISR() 5 veces.

El problema que tenemos a veces es que si tenemos un botón conectado a un puerto para que genere una interrupción este puede generar un pequeño rebote al ser pulsado y hacer que una interrupción se ejecute varias veces, para evitar esto podemos incluir un pequeño delay en la función ISR() y al final de la función incluir el siguiente código para limpiar posibles interrupciónes que se hayan producido durante la ejecución de la propia ISR():

Para INT0

EIFR |= (1 << INTF0);

Para INT1

EIFR |= (1 << INTF1);

Para Registro B

PCIFR |= (1 << PCIF0);

Para Registro C

PCIFR |= (1 << PCIF1);

Para Registro D

PCIFR |= (1 << PCIF2);
Tags

AVR | microcontrolador | hardware interrupts